# 状压DP实在是太难了呜呜呜，而且，根本就找不到思路嘛，不看答案或题解，根本想不到。
# 果然还是我太菜了
def check(j):
    c = f"{j:0>{f'{n}'}b}"
    for i in range(n):
        for j in range(n):
            if a[i][j] == '1' and c[i] == '1' and c[j] == '1':
                return False
    return True

n = int(input())
a = []
for i in range(n):
    a.append(list(input()))
dp = [17] * (1 << n)
sm = 0
x = 1
mod = 1 << 32
for i in range(1 << n):
    if check(i): # 应该是检测的当前方案是否有边的时候，两边不是都有颜色，就可以只涂一个颜色了？不懂。。
        dp[i] = 1
    else: # 否则就是最大值，代表没有办法涂
        dp[i] = 17
        # 全文背诵找补集环节
        j = i
        while j:
            dp[i] = min(dp[i], dp[j] + dp[j ^ i])
            j = (j - 1) & i
    # sm 加上相乘值并取模
    sm += x * dp[i]
    sm %= mod
    # x乘233并取模
    x *= 233
    x %= mod
# 最后好像比答案多1，也不知道为啥，就减去吧。。。
print((sm + mod - 1) % mod)
# 你超时我可以理解，为什么会运行时错误啊。。
# 啊这，样例1的n是16，但是，其实是15行15列的。。。。
# 用例2 is the same !!!
# -------------------------------------------------------------------------------

# 比赛环境为python3.8.6版本自带的IDLE，最好早点熟悉一下。。这个东西的提示时有时无

# 菜单栏最右边的Help的Python Docs 比赛时候也可以看，不过建议还是提前多了解了解，

# 比赛的时候至少知道在文档找什么能用的上。

# IDLE是下载Python时自带的，在按住win+s搜索IDLE就能搜到了。

# 然后点左上角的File可以创建新文件，然后按F5可以运行。
